<!--
  Any copyright is dedicated to the Public Domain.
  http://creativecommons.org/publicdomain/zero/1.0/
-->
<!DOCTYPE HTML>
<html>
<head>
  <meta charset="utf-8">
  <title>Test for DOM Worker Threads</title>
  <script type="text/javascript" src="/tests/SimpleTest/SimpleTest.js"></script>
  <link rel="stylesheet" type="text/css" href="/tests/SimpleTest/test.css" />
</head>
<body>
<p id="display"></p>
<div id="content" style="display: none"></div>
<pre id="test">
<iframe id="workerFrame" src="suspend_iframe.html" onload="subframeLoaded();">
</iframe>
<script class="testbody" type="text/javascript">

  SimpleTest.waitForExplicitFinish();

  var iframe;
  var lastCount;

  var suspended = false;
  var resumed = false;
  var finished = false;

  var interval;
  var oldMessageCount;
  var waitCount = 0;

  function finishTest() {
    if (finished) {
      return;
    }
    finished = true;
    SpecialPowers.flushPrefEnv(function () {
      iframe.terminateWorker();
      SimpleTest.finish();
    });
  }

  function waitInterval() {
    if (finished) {
      return;
    }
    is(String(iframe.location), "about:blank", "Wrong url!");
    is(suspended, true, "Not suspended?");
    is(resumed, false, "Already resumed?!");
    is(lastCount, oldMessageCount, "Received a message while suspended!");
    if (++waitCount == 5) {
      clearInterval(interval);
      resumed = true;
      iframe.history.back();
    }
  }

  function badOnloadCallback() {
    if (finished) {
      return;
    }
    ok(false, "We don't want suspend_iframe.html to fire a new load event, we want it to come out of the bfcache!");
    finishTest();
  }

  function suspendCallback() {
    if (finished) {
      return;
    }
    is(String(iframe.location), "about:blank", "Wrong url!");
    is(suspended, false, "Already suspended?");
    is(resumed, false, "Already resumed?");
    SpecialPowers.popPrefEnv(function () {
      suspended = true;
      var iframeElement = document.getElementById("workerFrame");
      iframeElement.onload = badOnloadCallback;
      oldMessageCount = lastCount;
      interval = setInterval(waitInterval, 1000);
    });
  }

  function messageCallback(data) {
    if (finished) {
      return;
    }

    if (!suspended) {
      ok(lastCount === undefined || lastCount == data - 1,
         "Got good data, lastCount = " + lastCount + ", data = " + data);
      lastCount = data;
      if (lastCount == 25) {
        SpecialPowers.pushPrefEnv({"set": [["browser.sessionhistory.cache_subframes", true]]}, function () {
          iframe.location = "about:blank";
          // We want suspend_iframe.html to go into bfcache, so we need to flush
          // out all pending notifications. Otherwise, if they're flushed too
          // late, they could kick us out of the bfcache again.
          iframe.document.body.offsetTop;
        });
      }
      return;
    }

    var newLocation =
      window.location.toString().replace("test_suspend.html",
                                         "suspend_iframe.html");
    is(newLocation.indexOf(iframe.location.toString()), 0, "Wrong url!");
    is(resumed, true, "Got message before resumed!");
    is(lastCount, data - 1, "Missed a message, suspend failed!");
    finishTest();
  }

  function errorCallback(data) {
    if (finished) {
      return;
    }
    ok(false, "Iframe had an error: '" + data + "'");
    finishTest();
  }

  function subframeLoaded() {
    if (finished) {
      return;
    }
    var iframeElement = document.getElementById("workerFrame");
    iframeElement.onload = suspendCallback;

    iframe = iframeElement.contentWindow;
    ok(iframe, "No iframe?!");

    iframe.startWorker(messageCallback, errorCallback);
  }

</script>
</pre>
</body>
</html>
